{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "fd833835",
   "metadata": {},
   "source": [
    "### File Info\n",
    "- Created on 2021/12/15\n",
    "- note  : Train and validation with VGG19 model\n",
    "- author: Yuze Xuan, Xiaohu Hao, Xuan Wang, Sida Wang"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "043c2708",
   "metadata": {},
   "source": [
    "## 导入包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "87190c37",
   "metadata": {},
   "outputs": [],
   "source": [
    "import copy\n",
    "import glob\n",
    "import os\n",
    "import random\n",
    "from typing import List, Tuple\n",
    "\n",
    "import cv2\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from tensorflow import keras\n",
    "from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint, History, TensorBoard\n",
    "\n",
    "from config import *\n",
    "from vgg19 import vgg19"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4e017254",
   "metadata": {},
   "source": [
    "## 获取数据文件信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "fd329dda",
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_img_info(path: str, image_ext_ls: List[str]) -> Tuple[List[str], List[str], int]:\n",
    "    \"\"\" 获取文件夹中所有图像的路径和标签.\n",
    "    :param path: 训练数据集路径.\n",
    "    :param image_ext_ls: 图像格式信息列表.\n",
    "    :return: 元组：包含图像路径列表、图像类别标签列表、类别数量.\n",
    "    \"\"\"\n",
    "    img_path_ls, lb_ls, path_ls_temp = [], [], []\n",
    "    sub_dirs = os.listdir(path)  # 数据集子路径\n",
    "    if '.DS_Store' in sub_dirs:  # 去除Apple临时文件\n",
    "        sub_dirs.remove('.DS_Store')\n",
    "    sub_dirs.sort()\n",
    "    print(sub_dirs)\n",
    "    for index in range(len(sub_dirs)):\n",
    "        sub_dir = os.path.join(path, sub_dirs[index])\n",
    "        # sys.stdout.flush()\n",
    "        print(\"dir --> label : {} --> {}\".format(sub_dir, index))\n",
    "        path_ls_temp = glob.glob(\"{}/*{}\".format(sub_dir, image_ext_ls))\n",
    "        img_path_ls += path_ls_temp\n",
    "        img_num_temp = len(path_ls_temp)\n",
    "        lb_ls += copy.deepcopy([index] * img_num_temp)\n",
    "    return img_path_ls, lb_ls, len(sub_dirs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "acbdb629",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['auditorium', 'football', 'gym', 'swimming_pool']\n",
      "dir --> label : dataset/train_and_val/auditorium --> 0\n",
      "dir --> label : dataset/train_and_val/football --> 1\n",
      "dir --> label : dataset/train_and_val/gym --> 2\n",
      "dir --> label : dataset/train_and_val/swimming_pool --> 3\n"
     ]
    }
   ],
   "source": [
    "image_path_ls, label_ls, classes_num = get_img_info(os.path.join(DATASET_BASE_PATH, 'train_and_val'), IMAGE_EXT)\n",
    "\n",
    "# 采用相同的随机数种子打乱图像路径列表和标签列表\n",
    "SEED = random.random()\n",
    "random.seed(SEED)\n",
    "random.shuffle(image_path_ls)\n",
    "random.seed(SEED)\n",
    "random.shuffle(label_ls)\n",
    "labels_ls: List[np.ndarray] = list(keras.utils.to_categorical(label_ls, classes_num))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a59cbb97",
   "metadata": {},
   "source": [
    "## 图像增强及图像生成器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "8af140c2",
   "metadata": {},
   "outputs": [],
   "source": [
    "def image_load_enhancer(img_path: str, **kwargs):\n",
    "    \"\"\" 图像读取、图像增强.\n",
    "    :param img_path: 图像路径.\n",
    "    :param kwargs: 图像增强关键字实参字典.\n",
    "    :return: 增强后的图像数据.\n",
    "    \"\"\"\n",
    "    img: np.ndarray = cv2.imread(img_path)\n",
    "    img = cv2.resize(img, dsize=IMAGE_SIZE, interpolation=cv2.INTER_AREA)\n",
    "    img = img.astype(\"float32\")\n",
    "    img /= 255.\n",
    "\n",
    "    if random.random() < kwargs.get('crop_probability', 0):\n",
    "        x_crop = random.randint(0, kwargs.get('crop_fix_range', 0))\n",
    "        y_crop = random.randint(0, kwargs.get('crop_fix_range', 0))\n",
    "        img = img[x_crop:, y_crop:, :]\n",
    "        img = cv2.resize(img, dsize=IMAGE_SIZE, interpolation=cv2.INTER_AREA)\n",
    "    if random.random() < kwargs.get('flip_probability', 0):\n",
    "        flip_type = np.random.choice([1, 0, -1], p=[kwargs['horizontal_flip'],\n",
    "                                                    kwargs['vertical_flip'],\n",
    "                                                    kwargs['diagonal_flip']])  # 分别对应[水平, 垂直, 对角]镜像\n",
    "        img = cv2.flip(img, flip_type, dst=None)\n",
    "        img = cv2.resize(img, dsize=IMAGE_SIZE, interpolation=cv2.INTER_AREA)\n",
    "    return np.array(img)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "b8f2e512",
   "metadata": {},
   "outputs": [],
   "source": [
    "def image_generator(img_paths: List[str], labels: List[np.ndarray], batch_size: int, **kwargs):\n",
    "    \"\"\" 图像生成器.\n",
    "    :param img_paths: 图像路径列表.\n",
    "    :param labels: 图像标签列表.\n",
    "    :param batch_size: 批处理图像数.\n",
    "    :param kwargs: 图像增强关键字实参字典.\n",
    "    :return: 图像生成器.\n",
    "    \"\"\"\n",
    "    start = 0\n",
    "    while start < len(img_paths):\n",
    "        stop = start + batch_size\n",
    "        if stop > len(img_paths):\n",
    "            stop = len(img_paths)\n",
    "        curr_images, curr_labels = [], []\n",
    "        for idx in range(start, stop):\n",
    "            curr_images.append(image_load_enhancer(img_paths[idx], **kwargs))\n",
    "            curr_labels.append(labels[idx])\n",
    "        yield np.array(curr_images), np.array(curr_labels)\n",
    "        if start + batch_size < len(img_paths):\n",
    "            start += batch_size\n",
    "        else:\n",
    "            seed = random.random()\n",
    "            random.seed(seed)\n",
    "            random.shuffle(img_paths)\n",
    "            random.seed(seed)\n",
    "            random.shuffle(labels)\n",
    "            start = 0"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7ec2d6cf",
   "metadata": {},
   "source": [
    "## 数据集划分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "bdc04afd",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据集划分训练集与验证集\n",
    "train_num = int(TRAIN_RATIO * len(image_path_ls))  # 训练集图像数\n",
    "train_x, train_y = image_path_ls[:train_num], labels_ls[:train_num]\n",
    "val_x, val_y = image_path_ls[train_num:], labels_ls[train_num:]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "029d0279",
   "metadata": {},
   "source": [
    "## 建立模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "bb9864cf",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Metal device set to: Apple M1 Max\n"
     ]
    }
   ],
   "source": [
    "# 建立模型实体\n",
    "model = vgg19(classes_num)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0e86e204",
   "metadata": {},
   "source": [
    "## 训练及验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "fc38279b",
   "metadata": {},
   "outputs": [],
   "source": [
    "def train_and_val(**kwargs) -> History:\n",
    "    \"\"\" 模型训练和验证.\n",
    "    :param kwargs: 训练超参数关键字实参.\n",
    "    :return: tensorflow.keras.callbacks.History对象，其中History.history属性记录了模型训练的损失和精度等.\n",
    "    \"\"\"\n",
    "    # 模型学习过程配置\n",
    "    model.compile(loss=keras.losses.categorical_crossentropy,\n",
    "                  optimizer=keras.optimizers.Adadelta(learning_rate=kwargs['lr'], decay=0.),\n",
    "                  metrics=['acc'])\n",
    "\n",
    "    tb_callback = TensorBoard(log_dir=os.path.join(SAVE_BASE_PATH, \"tensorboard\"),\n",
    "                              histogram_freq=0, write_graph=True,\n",
    "                              write_images=True)  # TensorBoard CallBack对象\n",
    "    model_checkpoint = ModelCheckpoint(\n",
    "        filepath=os.path.join(SAVE_BASE_PATH, 'checkpoints', \"./vgg_{epoch:02d}-{val_loss:.2f}-{val_acc:.2f}.hdf5\"),\n",
    "        verbose=0, save_best_only=True)  # ModelCheckpoint CallBack对象\n",
    "    early_stopping = EarlyStopping(monitor='val_acc', patience=kwargs['patienceEpoch'])  # EarlyStopping CallBack对象\n",
    "\n",
    "    # 训练信息输出\n",
    "    print(\"Train and Validation Information:\\n\", \"-\" * 50)\n",
    "    print(\"class num : {}, train num : {}, validation num : {}\".format(classes_num, len(train_x), len(val_x)))\n",
    "    print(\"batch : {}, epochs : {}\\n\".format(kwargs['batch_size'], kwargs['epochs']), \"-\" * 50)\n",
    "\n",
    "    history = model.fit(x=image_generator(train_x, train_y, kwargs['batch_size'], **IMAGE_ENHANCER_KWARGS),\n",
    "                        epochs=kwargs['epochs'], steps_per_epoch=int(len(train_x) / kwargs['batch_size']),\n",
    "                        validation_data=image_generator(val_x, val_y, kwargs['batch_size'], **IMAGE_ENHANCER_KWARGS),\n",
    "                        validation_steps=int(len(val_x) / kwargs['batch_size']),\n",
    "                        callbacks=[early_stopping, tb_callback, model_checkpoint])\n",
    "    return history"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "b398c653",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train and Validation Information:\n",
      " --------------------------------------------------\n",
      "class num : 4, train num : 2597, validation num : 289\n",
      "batch : 16, epochs : 80\n",
      " --------------------------------------------------\n",
      "Epoch 1/80\n",
      "162/162 [==============================] - 80s 493ms/step - loss: 1.3827 - acc: 0.2809 - val_loss: 1.3887 - val_acc: 0.2396\n",
      "Epoch 2/80\n",
      "162/162 [==============================] - 79s 487ms/step - loss: 1.3651 - acc: 0.2863 - val_loss: 1.3572 - val_acc: 0.2361\n",
      "Epoch 3/80\n",
      "162/162 [==============================] - 79s 487ms/step - loss: 1.1745 - acc: 0.4572 - val_loss: 1.0965 - val_acc: 0.4410\n",
      "Epoch 4/80\n",
      "162/162 [==============================] - 79s 489ms/step - loss: 1.0311 - acc: 0.4967 - val_loss: 1.1051 - val_acc: 0.4688\n",
      "Epoch 5/80\n",
      "162/162 [==============================] - 80s 492ms/step - loss: 1.0183 - acc: 0.5184 - val_loss: 1.0754 - val_acc: 0.5069\n",
      "Epoch 6/80\n",
      "162/162 [==============================] - 79s 489ms/step - loss: 0.9445 - acc: 0.5637 - val_loss: 0.9565 - val_acc: 0.5868\n",
      "Epoch 7/80\n",
      "162/162 [==============================] - 79s 491ms/step - loss: 0.8540 - acc: 0.6439 - val_loss: 0.8894 - val_acc: 0.6354\n",
      "Epoch 8/80\n",
      "162/162 [==============================] - 80s 491ms/step - loss: 0.7401 - acc: 0.7032 - val_loss: 0.6034 - val_acc: 0.7917\n",
      "Epoch 9/80\n",
      "162/162 [==============================] - 80s 491ms/step - loss: 0.5476 - acc: 0.8051 - val_loss: 0.5622 - val_acc: 0.7917\n",
      "Epoch 10/80\n",
      "162/162 [==============================] - 79s 489ms/step - loss: 0.5105 - acc: 0.8136 - val_loss: 0.5025 - val_acc: 0.7986\n",
      "Epoch 11/80\n",
      "162/162 [==============================] - 80s 493ms/step - loss: 0.4635 - acc: 0.8384 - val_loss: 0.4583 - val_acc: 0.8333\n",
      "Epoch 12/80\n",
      "162/162 [==============================] - 80s 492ms/step - loss: 0.4383 - acc: 0.8535 - val_loss: 0.4594 - val_acc: 0.8264\n",
      "Epoch 13/80\n",
      "162/162 [==============================] - 80s 492ms/step - loss: 0.4171 - acc: 0.8617 - val_loss: 0.4220 - val_acc: 0.8438\n",
      "Epoch 14/80\n",
      "162/162 [==============================] - 80s 495ms/step - loss: 0.4019 - acc: 0.8648 - val_loss: 0.4556 - val_acc: 0.8299\n",
      "Epoch 15/80\n",
      "162/162 [==============================] - 79s 489ms/step - loss: 0.3760 - acc: 0.8729 - val_loss: 0.4565 - val_acc: 0.8438\n",
      "Epoch 16/80\n",
      "162/162 [==============================] - 79s 489ms/step - loss: 0.3784 - acc: 0.8772 - val_loss: 0.3304 - val_acc: 0.8854\n",
      "Epoch 17/80\n",
      "162/162 [==============================] - 79s 490ms/step - loss: 0.3248 - acc: 0.8962 - val_loss: 0.3778 - val_acc: 0.8785\n",
      "Epoch 18/80\n",
      "162/162 [==============================] - 80s 493ms/step - loss: 0.3327 - acc: 0.8900 - val_loss: 0.3304 - val_acc: 0.8854\n",
      "Epoch 19/80\n",
      "162/162 [==============================] - 79s 489ms/step - loss: 0.3221 - acc: 0.8935 - val_loss: 0.4533 - val_acc: 0.8333\n",
      "Epoch 20/80\n",
      "162/162 [==============================] - 79s 488ms/step - loss: 0.3137 - acc: 0.8973 - val_loss: 0.4248 - val_acc: 0.8507\n",
      "Epoch 21/80\n",
      "162/162 [==============================] - 79s 489ms/step - loss: 0.3078 - acc: 0.9012 - val_loss: 0.3591 - val_acc: 0.8715\n",
      "Epoch 22/80\n",
      "162/162 [==============================] - 80s 496ms/step - loss: 0.3062 - acc: 0.8950 - val_loss: 0.3414 - val_acc: 0.8715\n",
      "Epoch 23/80\n",
      "162/162 [==============================] - 79s 490ms/step - loss: 0.2961 - acc: 0.8977 - val_loss: 0.3198 - val_acc: 0.8958\n",
      "Epoch 24/80\n",
      "162/162 [==============================] - 79s 488ms/step - loss: 0.2896 - acc: 0.9059 - val_loss: 0.2930 - val_acc: 0.9028\n",
      "Epoch 25/80\n",
      "162/162 [==============================] - 79s 486ms/step - loss: 0.2751 - acc: 0.9128 - val_loss: 0.4276 - val_acc: 0.8646\n",
      "Epoch 26/80\n",
      "162/162 [==============================] - 79s 489ms/step - loss: 0.2575 - acc: 0.9171 - val_loss: 0.3572 - val_acc: 0.8958\n",
      "Epoch 27/80\n",
      "162/162 [==============================] - 79s 485ms/step - loss: 0.2698 - acc: 0.9140 - val_loss: 0.3245 - val_acc: 0.9028\n",
      "Epoch 28/80\n",
      "162/162 [==============================] - 78s 484ms/step - loss: 0.2639 - acc: 0.9175 - val_loss: 0.3143 - val_acc: 0.8993\n",
      "Epoch 29/80\n",
      "162/162 [==============================] - 105s 651ms/step - loss: 0.2687 - acc: 0.9155 - val_loss: 0.3505 - val_acc: 0.8542\n",
      "Epoch 30/80\n",
      "162/162 [==============================] - 79s 486ms/step - loss: 0.2519 - acc: 0.9182 - val_loss: 0.3347 - val_acc: 0.8854\n",
      "Epoch 31/80\n",
      "162/162 [==============================] - 79s 485ms/step - loss: 0.2553 - acc: 0.9155 - val_loss: 0.3420 - val_acc: 0.8958\n",
      "Epoch 32/80\n",
      "162/162 [==============================] - 79s 490ms/step - loss: 0.2296 - acc: 0.9213 - val_loss: 0.3603 - val_acc: 0.8924\n",
      "Epoch 33/80\n",
      "162/162 [==============================] - 79s 489ms/step - loss: 0.2583 - acc: 0.9175 - val_loss: 0.3164 - val_acc: 0.8889\n",
      "Epoch 34/80\n",
      "162/162 [==============================] - 78s 485ms/step - loss: 0.2281 - acc: 0.9275 - val_loss: 0.4870 - val_acc: 0.8819\n"
     ]
    }
   ],
   "source": [
    "train_history = train_and_val(**TRAIN_KWARGS)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7bbbeffd",
   "metadata": {},
   "source": [
    "## 训练过程分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "978f06bd",
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_train_history(history: History) -> None:\n",
    "    \"\"\" 训练过程acc和loss变化绘制.\n",
    "    :param history: tensorflow.keras.callbacks.History对象.\n",
    "    :return: None\n",
    "    \"\"\"\n",
    "    plt.figure()  # 新建一张图绘制acc变化曲线\n",
    "    plt.plot(history.history['acc'], label='training acc')\n",
    "    plt.plot(history.history['val_acc'], label='val acc')\n",
    "    plt.title('model accuracy')\n",
    "    plt.ylabel('accuracy')\n",
    "    plt.xlabel('epoch')\n",
    "    plt.legend(loc='lower right')\n",
    "    plt.savefig(os.path.join(SAVE_BASE_PATH, 'figures', 'acc_curve.png'))\n",
    "    plt.show()\n",
    "    plt.figure()  # 新建一张图绘制loss变化曲线\n",
    "    plt.plot(history.history['loss'], label='training loss')\n",
    "    plt.plot(history.history['val_loss'], label='val loss')\n",
    "    plt.title('model loss')\n",
    "    plt.ylabel('loss')\n",
    "    plt.xlabel('epoch')\n",
    "    plt.legend(loc='upper right')\n",
    "    plt.savefig(os.path.join(SAVE_BASE_PATH, 'figures', 'loss_curve.png'))\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "3e7f4535",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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r+hW6b4XXniBTZs2sW7dOgAWL17M6tWr2bRp0/HulNOnTyckJISioiL69evHtddeS2ho6AnX2blzJzNmzOCdd97h+uuv5/PPP+emm05dDTQsLIykpCSmTJnCyy+/zLvvvsuzzz7LxRdfzBNPPMG8efNOSDaVWbt2Le+//z6rVq3CGMOAAQMYOnQou3fvpnXr1sydOxeA3NxcDh8+zJdffsm2bdsQkdNWZdVUsx1ZHBwURPyE5/F+MAm3blfyR4+v+No8wJFVnzJ92R5Xh6eUqiP9+/c/oU/966+/Ts+ePRk4cCD79+9n586dp5zTvn17evXqBUDfvn1JSUmp9NrXXHPNKccsX76c8eOtZadHjhxJy5Ytq41v+fLlXH311fj5+eHv788111zDsmXL6N69OwsWLOCxxx5j2bJlBAUFERgYiI+PD3feeSdffPEFvr6+tfw2KtfoZh+tc0HReF4/HfZNouUPj/J6+pu8vDEAhj/h6siUavSqunOvT35+fsefL168mAULFrBixQp8fX258MILK+1z7+3tffy5u7v78aqhqo5zd3envNzqgFLbdseqju/UqRNr167l+++/54knnmDEiBE89dRTrF69moULFzJz5kzeeOMNfv7551q9X2WabYngFG0Hwl2LKHb3p/WRNeQcLXV1REqpWgoICCA/P7/K/bm5ubRs2RJfX1+2bdvGypUr6zyGCy64gNmzZwPw448/cuTIkWqPHzJkCF999RVHjx6lsLCQL7/8ksGDB5OWloavry833XQTDz/8MElJSRQUFJCbm8uoUaN49dVXj1eBnS0tEVTk5k5pq550P7CLpTuzuLJna1dHpJSqhdDQUAYNGkR8fDyXXXYZo0ePPmH/yJEjmTp1Kj169KBz584MHDiwzmN4+umnmTBhArNmzWLo0KFERUUREBBQ5fF9+vRh4sSJ9O/fH4A777yT3r17M3/+fB555BHc3Nzw9PTkrbfeIj8/nzFjxlBcXIwxhv/85z91ErM0tu6TCQkJxpkL09h/ehbbL6/xly4/8OL4AU57H6Waqq1bt9K1a1dXh+EyJSUluLu74+HhwYoVK/jDH/5QZ3fuNVXZfwMRWWuMSajseC0RnMQtpg9u2Di4cy12e3/c3HSovFKq5vbt28f111+P3W7Hy8uLd955x9UhnZYmgpO17gNAbPE2tqTnER8d5OKA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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_train_history(train_history)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
